<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
	<META HTTP-EQUIV="CONTENT-TYPE" CONTENT="text/html; charset=utf-8">
	<TITLE></TITLE>
	<META NAME="GENERATOR" CONTENT="OpenOffice.org 2.4  (Unix)">
	<META NAME="CREATED" CONTENT="20080603;19285600">
	<META NAME="CHANGED" CONTENT="20080603;22004700">
	<STYLE TYPE="text/css">
	<!--
		@page { size: 8.27in 11.69in; margin: 0.79in }
		P { margin-bottom: 0.08in }
		H1 { margin-bottom: 0.08in; page-break-after: avoid }
		H1.western { font-family: "Arial", sans-serif; font-size: 16pt; font-weight: bold }
		H1.cjk { font-family: "Verdana"; font-size: 16pt; font-weight: bold }
		H1.ctl { font-family: "Verdana"; font-size: 16pt; font-weight: bold }
		H2 { margin-bottom: 0.08in; page-break-after: avoid }
		H2.western { font-family: "Arial", sans-serif; font-size: 14pt; font-style: italic; font-weight: bold }
		H2.cjk { font-family: "Verdana"; font-size: 14pt; font-style: italic; font-weight: bold }
		H2.ctl { font-family: "Verdana"; font-size: 14pt; font-style: italic; font-weight: bold }
		H3 { margin-bottom: 0.08in; page-break-after: avoid }
		H3.western { font-family: "Arial", sans-serif; font-size: 14pt; font-weight: bold }
		H3.cjk { font-family: "Verdana"; font-size: 14pt; font-weight: bold }
		H3.ctl { font-family: "Verdana"; font-size: 14pt; font-weight: bold }
		A:link { color: #000080; text-decoration: underline }
		A:visited { color: #800000; text-decoration: underline }
	-->
	</STYLE>
</HEAD>
<BODY LANG="ru-RU" LINK="#000080" VLINK="#800000" DIR="LTR">
<H1 CLASS="western">Объекты, сеть и Jini</H1>
<H2 CLASS="western">Чиста Jini</H2>
<P>Традиционно, операционные системы
разрабатываются исходя из предположения,
что у компьютера есть процессор, память
и диск. Когда вы загружаете компьютер,
первым делом он ищет диск. Если он не
находит диск, он не может функционировать
как компьютер. Но в последнее время все
чаще используется другой подход.
Встраиваемые устройства имеют процессор,
память и соединение с сетью, но не имеют
диска. Первым делом мобильный телефон
ищет телефонную сеть. Если он не находит
её, он не может функционировать как
телефон. Изменение ориентации с
диско-ориентированных на сеть-ориентированные
устройства влияет и на программное
обеспечение. Вот тут-то и пригождается
Jini.</P>
<P>Jini — попытка переосмыслить архитектуру
компьютера, исходя из возрастающей
важности сети и увеличения количества
бездисковых устройств. Эти устройства,
произведенные разными компаниями,
должны взаимодействовать через сеть.
Сеть сама по себе очень динамична —
устройства и сервисы регулярно добавляются
и удаляются. Jini предоставляет механизм,
позволяющий с легкостью добавлять,
удалять и искать устройства и сервисы
в сети. В добавок к этому Jini предоставляет
программную модель, которая упрощает
работу программиста по организации
взаимодействия между устройствами.</P>
<P>Разработанная с использованием Java,
сериализации и RMI, которые позволяют
передавать объекты по сете от виртуальной
машины к виртуальной машине, Jini пытается
использовать преимущества
объектно-ориентированного программирования
в организации сетевого взаимодействия.
Вместо того, чтобы требовать от
производителей стандартизации сетевых
протоколов, с помощью которых
взаимодействуют устройства, Jini позволяет
устройствам общаться друг с другом
посредством объектных интерфейсов.</P>
<H2 CLASS="western">Так что это за фигня — Jini?</H2>
<P>Jini — это набор API и сетевых протоколов,
которые помогают создавать и внедрять
распределенные системы, организованные
как федерация сервисов. Сервисом может
быть что угодно, что доступно через
сеть, и способно выполнять какую-нибудь
полезную (или бесполезную) функцию.
Аппаратные устройства, программное
обеспечение, коммуникационные каналы
и даже сами пользователи могут быть
сервисами. Например, поддерживающий
Jini диск может предоставлять сервис
«хранилище». Поддерживающий  Jini принтер
может предоставлять сервис «печать».
Федерация сервисов — это набор сервисов,
доступных в сети в текущий момент
времени, которые клиент (программа,
другой сервис или пользователь) может
объединить для достижения какой-либо
цели.</P>
<P>Чтобы выполнить свою задачу, клиент
использует сервисы. Например, клиентская
программа может скачивать картинки из
сервиса хранилища изображений в цифровой
камере, загружать их в сервис хранилища,
предоставляемый жестким диском, и
пересылать страницу с уменьшенными
копиями изображений на сервис печати.
В этом случае клиентская программа
создает распределенную систему, состоящую
из себя самой, сервиса хранилища
изображений, сервиса хранилища файлов
и сервиса печати. Клиент и сервисы этой
распределенной системы работают вместе,
чтобы выполнить общую задачу — перенести
изображения на жесткий диск и распечатать
уменьшенные копии.</P>
<P>Под словом «федерация» подразумевается
то, что Jini не предполагает централизованного
управления в сети. Так как ни один сервис
нельзя назвать главным, набор всех
сервисов доступен через сеть как
федерация — сгруппированный набор
равнозначных сущностей. Вместо
централизованного управления,
инфраструктура Jini предоставляет способ
находить друг друга клиентам и сервисам
(с помощью поискового сервиса, который
хранит список всех доступных на данный
момент сервисов). После того как сервис
и клиент обнаружили друг друга, они
взаимодействуют сами по себе. Клиент и
используемые им сервисы выполняют
задачи независимо от инфраструктуры
Jini. Если поисковый сервис Jini выходит из
строя, распределенная система, собранная
с его помощью, может продолжать работу.
Также Jini включает в себя сетевой протокол,
позволяющий клиентам находить сервисы
даже в отсутствии поискового сервиса.</P>
<H2 CLASS="western">Как вся эта хрень работает?</H2>
<P>Jini определяет инфраструктуру выполнения,
которая располагается в сети, и
предоставляет механизмы, позволяющие
добавлять, удалять, искать и получать
доступ к сервисам. Инфраструктура
выполнения делится на три части: поисковые
сервисы, поставщики сервисов и клиенты
сервисов. Поисковые сервисы — основной
организационный механизм в основанных
на Jini системах. Когда новый сервис
становится доступным в сети, он
регистрирует себя в поисковом сервисе.
Когда клиент хочет найти сервис, который
поможет ему в выполнении какой-либо
задачи, он обращается к поисковому
сервису.</P>
<P>Инфраструктура выполнения использует
один протокол сетевого уровня, называющийся
«обнаружение» (discovery), и два протокола
объектного уровня, называющихся
«присоединение» (join) и «поиск» (lookup).
Обнаружение позволяет клиентам и
сервисам найти поисковые сервисы.
Присоединение позволяет сервису
зарегистрировать себя в поисковом
сервисе. Поиск позволяет клиенту
запросить у поискового сервиса те
сервисы, которые могут помочь ему в
выполнении своей задачи.</P>
<H3 CLASS="western">Обнаружение</H3>
<P>Обнаружение работает следующим
образом: представьте, что у вас есть
жесткий диск, поддерживающий Jini, который
предоставляет сервис хранилища. Как
только вы подключаете диск к сети, он
рассылает уведомление о своем присутствии
с помощью широковещательной отправки
пакета через определенный порт. В этот
пакет включены данные об IP-адресе и
порте, через которые поисковый сервис
может связаться с диском.</P>
<P>Поисковый сервис отслеживает
определенный порт и ждет уведомления
о присутствии. Как только он получает
такое уведомление, он распаковывает и
анализирует его. В нем, как правило,
содержится информация о том, должен ли
он соединиться с отправителем пакета.
Если да, то он соединяется с ним напрямую
через TCP соединение по IP адресу и порту,
указанному в пакете. Используя RMI,
поисковый сервис посылает через сеть
объект, называющийся регистратором
сервисов. Задача этого объекта —
дальнейшее взаимодействие с поисковым
сервисом. Вызывая методы этого объекта,
отправитель уведомления о присутствии
может выполнить присоединение или поиск
с помощью поискового сервиса. В случае
диска, поисковый сервис создает TCP
соединение с диском и посылает туда
регистратор сервисов, с помощью которого
диск регистрирует себя как хранилище,
вызвав метод присоединения.</P>
<H3 CLASS="western">Присоединение</H3>
<P>Как только поставщик сервиса получил
объект-регистратор сервисов, результат
обнаружения, он готов присоединиться
— стать частью федерации сервисов,
зарегистрированных в поисковом сервисе.
Для этого поставщик сервиса вызывает
метод register() у объекта-регистратора
сервисов, передавая в качестве параметра
объект, называемый элементом сервиса
— набор объектов, характеризующих
сервис. Метод register() пересылает копию
элемента сервиса поисковому сервису,
где этот объект сохраняется. После этого
поставщик сервиса завершает процесс
присоединения, и его сервис оказывается
зарегистрированным в поисковом сервисе.</P>
<P>Элемент сервиса — это контейнер для
нескольких объектов, включающий в себя
объект, называемый объектом сервиса,
который клиенты могут использовать для
взаимодействия с сервисом. Также элемент
сервиса включает в себя ряд атрибутов,
которые могут быть произвольными
объектами. Например, это могут быть
иконки, классы, которые предоставляют
графический пользовательский интерфейс
к сервису и объекты, и объекты, хранящие
дополнительную информацию о сервисе.</P>
<P>Объекты сервиса обычно реализуют один
или несколько интерфейсов, через которые
клиент может взаимодействовать с
сервисом. Например, поисковый сервис —
это Jini сервис, и его объект сервиса —
это регистратор сервисов. Метод
register(), вызываемый поставщиком сервисов
во время процесса присоединения, объявлен
в ServiceRegitrar интерфейсе (чать пакета
net.jini.core.lookup), который реализуют все
регистраторы сервисов. Клиенты и сервисы
взаимодействуют с поисковым сервисом
через регистратор сервисов, вызывая
методы, декларированные в интерфейсе
ServiceRegistrar. А жесткий диск будет
предоставляеть объект сервиса, реализующий
какой-нибудь стандартный интерфейс
сервиса хранилища. Клиенты будут искать
и взаимодействовать с диском через этот
интерфейс сервиса хранилища.</P>
<H3 CLASS="western">Поиск</H3>
<P>Как только сервис зарегистрирован в
поисковом сервисе с помощью процесса
присоединения, сервис становится
доступным для клиентов, которые
запрашивают поисковый сервис. Чтобы
построить распределенную систему
сервисов, которая будет работать вместе
и выполнять какую-либо задачу, клиент
должен найти отдельный сервисы и
воспользоваться их возможностями. Чтобы
найти сервис, клиент запрашивает
поисковый сервис с помощью процесса,
называемого поиском.</P>
<P>Чтобы выполнить поиск, клиент вызывает
метод lookup() у регистратора сервисов
(клиент, как и поставщик сервисов,
получает его с помощью процесса
обнаружения). Клиент передает шаблон
сервиса в качестве аргумента метода
lookup(). Это объект, являющийся критерием
поиска. Шаблон сервиса может содержать
ссылку на массив объектов типа Class. Эти
объекты позволяют поисковому сервису
понять, какой Java-тип (или типы) объекта
сервиса необходим клиенту. Также шаблон
сервиса может включать идентификатор
сервиса, который однозначно определяет
сервис и атрибуты, которые должны точно
совпадать с атрибутами в элементе
сервиса, предоставленном поставщиком
сервисов. Еще шаблон сервиса может
включать универсальные версии любого
из этих полей. Например, универсальный
идентификатор сервиса будет соответствовать
любому идентификатору сервиса. Метод
lookup() посылает шаблон сервиса поисковому
сервису, который производит запрос и
возвращает некоторое количество
подходящих объектов сервиса. 
</P>
<P>В общем случае, клиент ищет сервис по
Java-типу, как правило, по интерфейсу.
Например, если клиенту необходим принтер,
он составит шаблон сервиса, который
включает в себя Class-объект для стандартного
интерфейса сервиса печати. Все сервисы
печати должны реализовывать этот
интерфейс. Поисковый сервис возвратит
объект сервиса (или несколько подходящих
объектов), которые реализуют этот
интерфейс. Атрибуты могут быть включены
в шаблон сервиса, чтобы сузить диапазон
поиска. Клиент может использовать сервис
печати, вызывая методы объекта сервиса,
декларированные в стандартном интерфейсе
сервиса печати.</P>
<H2 CLASS="western">Разделение интерфейса и
реализации</H2>
<P>Архитектура Jini позволяет использовать
объектно-ориентированное программирование
для организации сетевого взаимодействия
и получить одно из ключевых его преимуществ
— разделение интерфейса и реализации.
Например, объект сервиса может
предоставлять клиентам доступ к сервису
множеством различных способов. Объект
может представлять собой сервис целиком,
который скачивается к клиенту во время
процедуры поиска и позднее запускается
локально. Кроме того, объект сервиса
может просто предоставлять интерфейс
для взаимодействия с удаленным сервером.
В этом случае, когда клиент вызывает
методы объекта сервиса, он через сеть
посылает запросы серверу, который на
самом деле делает всю работу. Локальный
объект сервиса и удаленный сервер также
могут работать совместно каждый над
своей частью задачи.</P>
<P>Важное следствие архитектуры Jini —
это то, что сетевой протокол, используемый
для взаимодействия локального объекта
сервиса и удаленного сервера может быть
неизвестен клиенту. Как показано на
рисунке снизу, сетевой протокол — часть
реализации сервиса.<B> </B><SPAN STYLE="font-weight: medium">Объект
сервиса</SPAN><B> </B>может взаимодействовать
с сервисом через RMI, CORBA, DCOM, или любой
другой протокол. Клиенту просто не нужно
беспокоиться о сетевых протоколах, так
как он взаимодействует только с локальным
объектом сервиса, который реализовывает
какой-либо интерфейс. Объект сервиса
сам заботится о всем взаимодействии
через сеть.</P>
<P><IMG SRC="artima_com_jini_jiniology_intro_html_1ca92eab.gif" NAME="Графический объект1" ALIGN=LEFT WIDTH=371 HEIGHT=152 BORDER=0><BR CLEAR=LEFT>Различные
реализации одного и того же интерфейса
сервиса могут использовать абсолютно
разные подходы и различные сетевые
протоколы. Например, сервис может
использовать специализированное
аппаратное обеспечение, чтобы выполнить
запросы клиента, или он может использовать
программную реализацию для выполнения
тех же самых запросов. Более того,
реализация одного и того же сервиса
может изменяться с течением времени. И
клиент всегда может быть уверен, что
использует правильную версию объекта
сервиса, поскольку она предоставляется
поставщиком сервиса. Для клиента сервис
выглядит как известный интерфейс,
независимо от того, как он реализован
на самом деле.</P>
<H2 CLASS="western">Заключение</H2>
<P>Jini стремится увеличить уровень
абстракции распределенных систем с
уровня сетевого протокола до уровня
объектного интерфейса. Учитывая
распространение устройств, подключаемых
к сети, многие части распределенной
системы могут быть произведены различными
компаниями. Jini позволяет не заботится
о стандартизации протоколов уровня
сети, чтобы позволить устройствам
взаимодействовать. Вместо этого,
производителям следует стандартизировать
Java-интерфейсы, с помощью которых
устройства смогут взаимодействовать.
Процессы обнаружения, присоединения и
поиска, предоставляемые инфраструктурой
выполнения Jini, позволит устройствам
находить друг друга в сети. Как только
они обнаружат друг друга, устройства
смогут взаимодействовать друг с другом
через Java-интерфейсы.</P>
<H1 CLASS="western">Хуй в сапог!</H1>
</BODY>
</HTML>